﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace PronosGestor
{
    /// <summary>
    /// Fournit les méthodes de calcul de diverses statistiques de pronostics.
    /// Des éléments sont également stockés, tel que les classements de chaque journée
    /// </summary>
    public partial class StatsGenerales
    {

        private KeyValuePair<List<string>, T> DonnerRecord<T>(Func<DonneesCompletesClassement, T> record, T max)
            where T : IComparable, IFormattable, IConvertible
        {
            var liste = new List<string>();

            // parcours de chaque journée
            foreach (var classement in ClassementsJournees)
            {
                // parcours de chaque couple joueur / résultat
                foreach (var item in classement)
                {
                    if (Convert.ToDouble(record(item.Value)) == Convert.ToDouble(max) && !liste.Contains(item.Key))
                        liste.Add(item.Key);
                }
            }
            return new KeyValuePair<List<string>, T>(liste, max);
        }

        private Dictionary<string, int> VainqueursEtPoints { get; set; }

        private static Dictionary<JourneePronostiquee, string> MiseAPlatJourneesPronos(List<Participant> participants)
        {
            var allJourneesPronostiquees = new Dictionary<JourneePronostiquee, string>();
            foreach (var participant in participants)
            {
                foreach (var journee in participant.JourneesPronostiquees)
                {
                    allJourneesPronostiquees.Add(journee, participant.nom);
                }
            }
            return allJourneesPronostiquees;
        }

        private int DonnerNombreVictoiresJoueur(Participant joueur)
        {
            return ClassementVainqueurs.Where(x => x.Key == joueur.nom).Select(x => x.Value).FirstOrDefault();
        }

        private void DeterminerVainqueursJournees(List<JourneeJouee> journees, Dictionary<JourneePronostiquee, string> allJourneesPronostiquees)
        {
            for (int i = 0; i < journees.Count; i++)
            {
                // récupération de toutes les journées pronostiquées pour la journée en cours
                var liste = allJourneesPronostiquees.Where(x => x.Key.IDJournee == i + 1).ToDictionary(x => x.Key, x => x.Value);

                int max = liste.Max(x => x.Key.Points);
                List<string> vainqueurs = liste.Where(x => x.Key.Points == max).Select(x => x.Value).ToList();

                // insertion dans le classement
                foreach (string vainqueur in vainqueurs)
                {
                    // MAJ de VainqueursEtPoints
                    if (VainqueursEtPoints.ContainsKey(vainqueur) && VainqueursEtPoints[vainqueur] < max)
                        VainqueursEtPoints[vainqueur] = max;
                    else if (!VainqueursEtPoints.ContainsKey(vainqueur))
                        VainqueursEtPoints.Add(vainqueur, max);

                    if (ClassementVainqueurs.ContainsKey(vainqueur))
                        ClassementVainqueurs[vainqueur] += 1;
                    else
                        ClassementVainqueurs.Add(vainqueur, 1);
                }
            }
        }
    }
}
